{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ch03/step_function.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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2lqVlJTo3Xffdbska7z99tvauHGj7r//frdLmfEGBgYUi8UUCARStgcCAfX19blUlfc5jqP6+npddNFFKi4udrscT/r1r3+t119/Xa+99prbpRiPlRED3XPPPfL5fIf92Lt3rzZu3KhIJKKGhga3S56xpvpaH6qnp0ff+ta39J3vfEc1NTUuVe49Pp8v5XPHccZtw9Fzyy236I9//KOefPJJt0vxpO7ubt122216/PHHlZ2d7XY5xqNnxEADAwMaGBg47D6nn366vvvd7+p3v/tdyht2LBZTZmamvve97+mXv/zlsS51xpvqa514M+np6dGyZcu0dOlSbdu2TRkZ5PkjNTo6qhNPPFFPPfWUrr766uT22267TV1dXdq5c6eL1XnTrbfequeff167du1SYWGh2+V40vPPP6+rr75amZmZyW2xWEw+n08ZGRkaGRlJ+TfbEUZmsHA4rEgkkvy8p6dHl19+uZ5++mktXbpUixYtcrE67/nggw+0bNkyBYNBPf7447yRHEVLly5VMBhUc3NzcttXvvIVffvb36aB9ShyHEe33nqrnnvuOf3hD3/QWWed5XZJnjU8PKz33nsvZduNN96oL3/5y/rxj3/MpbHPoGdkBlu8eHHK5yeffLIk6cwzzySIHGU9PT26+OKLtXjxYt1333366KOPkv+2YMECFyvzhvr6el1//fUqKSlRaWmpNm/erHA4rNraWrdL85SVK1fqiSee0G9+8xvNmTMn2ZOTm5ur2bNnu1ydt8yZM2dc4DjppJM0d+5cgsgECCPAFOzYsUNvvfWW3nrrrXFBj8XFI1dZWanBwUGtX79evb29Ki4uVltbmwoKCtwuzVMSt05ffPHFKdsfffRRrVix4vgXBBzEZRoAAOAquu8AAICrCCMAAMBVhBEAAOAqwggAAHAVYQQAALiKMAIAAFxFGAEAAK4ijAAAAFcRRgAAgKsIIwAAwFWEEQAA4CrCCAAAcNX/B8Cmfri/kqJcAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pylab as plt\n",
    "\n",
    "\n",
    "def step_function(x):\n",
    "    return np.array(x > 0, dtype=int)\n",
    "\n",
    "X = np.arange(-5.0, 5.0, 0.1)\n",
    "Y = step_function(X)\n",
    "plt.plot(X, Y)\n",
    "plt.ylim(-0.1, 1.1)  # 図で描画するy軸の範囲を指定\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ch03/sigmoid.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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7+qSSy5p2n7bbbdp7dq1WrJkiYnpvNOtt96qRYsWaenSpUpJSTE7jldatGiRLrnkEvn7+zdtc7lcslgs8vPzU11dXbOv+TrKiAfLz8+Xw+Fo+rywsFDnnHOO3nvvPWVmZqpv374mpvM+Bw4c0Omnn6709HS98cYbvJB0oMzMTKWnp2vevHlN24YNG6aLL76YAawdyDAM3Xrrrfrwww/19ddfa9CgQWZH8loVFRXat29fs23XXXedhg4dqt///vdcGvsJxox4sKSkpGafh4eHS5IGDBhAEelghYWFOu2005SUlKQnnnhChw4davpa7969TUzmHWbNmqWrr75aGRkZGjdunF544QXl5+dr+vTpZkfzKjfffLPefPNNffTRR4qIiGgak2Oz2RQSEmJyOu8SERFxVOEICwtTdHQ0RaQFlBGgFb788kvt3LlTO3fuPKrocXLxl5syZYrKyso0Z84cFRUVKS0tTYsXL1ZycrLZ0bzKj7dOn3baac22v/LKK7r22mu7PhDwAy7TAAAAUzH6DgAAmIoyAgAATEUZAQAApqKMAAAAU1FGAACAqSgjAADAVJQRAABgKsoIAAAwFWUEAACYijICAABMRRkBAACmoowAAABT/X+g0EHar+Hv5QAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pylab as plt\n",
    "\n",
    "\n",
    "def sigmoid(x):\n",
    "    return 1 / (1 + np.exp(-x))\n",
    "\n",
    "X = np.arange(-5.0, 5.0, 0.1)\n",
    "Y = sigmoid(X)\n",
    "plt.plot(X, Y)\n",
    "plt.ylim(-0.1, 1.1)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ch03/sig_step_compare.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pylab as plt\n",
    "\n",
    "\n",
    "def sigmoid(x):\n",
    "    return 1 / (1 + np.exp(-x))\n",
    "\n",
    "\n",
    "def step_function(x):\n",
    "    return np.array(x > 0, dtype=int)\n",
    "\n",
    "x = np.arange(-5.0, 5.0, 0.1)\n",
    "y1 = sigmoid(x)\n",
    "y2 = step_function(x)\n",
    "\n",
    "plt.plot(x, y1)\n",
    "plt.plot(x, y2, 'k--')\n",
    "plt.ylim(-0.1, 1.1) #図で描画するy軸の範囲を指定\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ch03/relu.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pylab as plt\n",
    "\n",
    "\n",
    "def relu(x):\n",
    "    return np.maximum(0, x)\n",
    "\n",
    "x = np.arange(-5.0, 5.0, 0.1)\n",
    "y = relu(x)\n",
    "plt.plot(x, y)\n",
    "plt.ylim(-1.0, 5.5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ch03/mnist_show.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading train-images-idx3-ubyte.gz ... \n",
      "Done\n",
      "Downloading train-labels-idx1-ubyte.gz ... \n",
      "Done\n",
      "Downloading t10k-images-idx3-ubyte.gz ... \n",
      "Done\n",
      "Downloading t10k-labels-idx1-ubyte.gz ... \n",
      "Done\n",
      "Converting train-images-idx3-ubyte.gz to NumPy Array ...\n",
      "Done\n",
      "Converting train-labels-idx1-ubyte.gz to NumPy Array ...\n",
      "Done\n",
      "Converting t10k-images-idx3-ubyte.gz to NumPy Array ...\n",
      "Done\n",
      "Converting t10k-labels-idx1-ubyte.gz to NumPy Array ...\n",
      "Done\n",
      "Creating pickle file ...\n",
      "Done!\n",
      "5\n",
      "(784,)\n",
      "(28, 28)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAABAElEQVR4nGNgGMyAWUhIqK5jvdSy/9/rGRgYGFhgEnJsVjYCwQwMDAxPJgV+vniQgYGBgREqZ7iXH8r6l/SV4dn7m8gmCt3++/fv37/Htn3/iMW+gDnZf/+e5WbQnoXNNXyMs/5GoQoxwVmf/n9kSGFiwAW49/11wynJoPzx4YIcRlyygR/+/i2XxCWru+vv32nSuGQFYv/83Y3b4p9/fzpAmSyoMnohpiwM1w5h06Q+5enfv39/bcMiJVF09+/fv39P+mFKiTtd/fv3799jgZiBJLT69t+/f/8eDuDEkDJf8+jv379/v7Ryo4qzMDAwMAQGMjBc3/y35wM2V1IfAABFF16Aa0wAOwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<PIL.Image.Image image mode=L size=28x28>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import sys, os\n",
    "sys.path.append(os.pardir)  # 親ディレクトリのファイルをインポートするための設定\n",
    "import numpy as np\n",
    "from dataset.mnist import load_mnist\n",
    "from PIL import Image\n",
    "\n",
    "\n",
    "def img_show(img):\n",
    "    pil_img = Image.fromarray(np.uint8(img))\n",
    "    pil_img.show()\n",
    "\n",
    "(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)\n",
    "\n",
    "img = x_train[0]\n",
    "label = t_train[0]\n",
    "print(label)  # 5\n",
    "\n",
    "print(img.shape)  # (784,)\n",
    "img = img.reshape(28, 28)  # 形状を元の画像サイズに変形\n",
    "print(img.shape)  # (28, 28)\n",
    "\n",
    "img_show(img)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ch03/neuralnet_mnist.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy:0.9352\n"
     ]
    }
   ],
   "source": [
    "import sys, os\n",
    "sys.path.append(os.pardir)  # 親ディレクトリのファイルをインポートするための設定\n",
    "import numpy as np\n",
    "import pickle\n",
    "from dataset.mnist import load_mnist\n",
    "from common.functions import sigmoid, softmax\n",
    "\n",
    "\n",
    "def get_data():\n",
    "    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)\n",
    "    return x_test, t_test\n",
    "\n",
    "\n",
    "def init_network():\n",
    "    with open(\"../ch03/sample_weight.pkl\", 'rb') as f:\n",
    "        network = pickle.load(f)\n",
    "    return network\n",
    "\n",
    "\n",
    "def predict(network, x):\n",
    "    W1, W2, W3 = network['W1'], network['W2'], network['W3']\n",
    "    b1, b2, b3 = network['b1'], network['b2'], network['b3']\n",
    "\n",
    "    a1 = np.dot(x, W1) + b1\n",
    "    z1 = sigmoid(a1)\n",
    "    a2 = np.dot(z1, W2) + b2\n",
    "    z2 = sigmoid(a2)\n",
    "    a3 = np.dot(z2, W3) + b3\n",
    "    y = softmax(a3)\n",
    "\n",
    "    return y\n",
    "\n",
    "\n",
    "x, t = get_data()\n",
    "network = init_network()\n",
    "accuracy_cnt = 0\n",
    "for i in range(len(x)):\n",
    "    y = predict(network, x[i])\n",
    "    p= np.argmax(y) # 最も確率の高い要素のインデックスを取得\n",
    "    if p == t[i]:\n",
    "        accuracy_cnt += 1\n",
    "\n",
    "print(\"Accuracy:\" + str(float(accuracy_cnt) / len(x)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ch03/neuralnet_mnist_batch.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy:0.9352\n"
     ]
    }
   ],
   "source": [
    "import sys, os\n",
    "sys.path.append(os.pardir)  # 親ディレクトリのファイルをインポートするための設定\n",
    "import numpy as np\n",
    "import pickle\n",
    "from dataset.mnist import load_mnist\n",
    "from common.functions import sigmoid, softmax\n",
    "\n",
    "\n",
    "def get_data():\n",
    "    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)\n",
    "    return x_test, t_test\n",
    "\n",
    "\n",
    "def init_network():\n",
    "    with open(\"../ch03/sample_weight.pkl\", 'rb') as f:\n",
    "        network = pickle.load(f)\n",
    "    return network\n",
    "\n",
    "\n",
    "def predict(network, x):\n",
    "    w1, w2, w3 = network['W1'], network['W2'], network['W3']\n",
    "    b1, b2, b3 = network['b1'], network['b2'], network['b3']\n",
    "\n",
    "    a1 = np.dot(x, w1) + b1\n",
    "    z1 = sigmoid(a1)\n",
    "    a2 = np.dot(z1, w2) + b2\n",
    "    z2 = sigmoid(a2)\n",
    "    a3 = np.dot(z2, w3) + b3\n",
    "    y = softmax(a3)\n",
    "\n",
    "    return y\n",
    "\n",
    "\n",
    "x, t = get_data()\n",
    "network = init_network()\n",
    "\n",
    "batch_size = 100 # バッチの数\n",
    "accuracy_cnt = 0\n",
    "\n",
    "for i in range(0, len(x), batch_size):\n",
    "    x_batch = x[i:i+batch_size]\n",
    "    y_batch = predict(network, x_batch)\n",
    "    p = np.argmax(y_batch, axis=1)\n",
    "    accuracy_cnt += np.sum(p == t[i:i+batch_size])\n",
    "\n",
    "print(\"Accuracy:\" + str(float(accuracy_cnt) / len(x)))\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "dezero:Python",
   "language": "python",
   "name": "conda-env-dezero-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
